package com.atguigu.udmp.web.userprofile.service.impl;

import com.atguigu.udmp.web.userprofile.bean.TaskInfo;
import com.atguigu.udmp.web.userprofile.constant.ConstCodes;
import com.atguigu.udmp.web.userprofile.mapper.UserTagBitmapMapper;
import com.atguigu.udmp.web.userprofile.mapper.UserTagDetailMapper;
import com.atguigu.udmp.web.userprofile.service.TaskExecuteService;
import com.atguigu.udmp.web.userprofile.service.TaskInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Date;
import java.util.List;

@Service
public class TaskExecuteServiceImpl implements TaskExecuteService {

    //1	 从标签任务表中查询对应周期下的标签任务列表
    //2  遍历每个标签任务
    //2.1 生成位图数据
    //2.1.1  尝试建立正式分区（如果已有就不建立了）
    //2.1.2   针对列表中的每个任务生成位图表的临时分区
    //2.1.3   写入临时分区
    //2.1.4   把临时分区替换为正式分区
    //2.2  如果根据存储模式中有明细表的需求则生成标签明细表。
    //2.2.1   针对列表中的每个任务生成明细表的临时分区
    //2.2.2   写入临时分区
    //2.2.3 把临时分区替换为正式分区
    //3  生成完毕后把任务完成时间写入标签任务的定义表，如果有异常也写入，便于异常的解决。


    @Autowired
    TaskInfoService taskInfoService;

    @Autowired
    UserTagBitmapMapper userTagBitmapMapper;
    UserTagDetailMapper userTagDetailMapper;

    @Override
    public void exec(String execCycle,String dt) {
        //1	 从标签任务表中查询对应周期下的标签任务列表
        List<TaskInfo> taskInfoList = taskInfoService.getTaskInfoListForOLAP(execCycle);
        System.out.println("taskInfoList = " + taskInfoList);
        //2  遍历每个标签任务

            for (TaskInfo taskInfo : taskInfoList) {
                try {
                    execTagBitmap(taskInfo, dt);
                    if (taskInfo.getSaveMode().equals(ConstCodes.SAVE_MODE_BITMAP_DETAIL)) {
                        execTagDetail(taskInfo, dt);
                    }
                }catch (Exception e){
                    taskInfo.setIsException("1");
                    StringWriter stringWriter= new StringWriter();
                    e.printStackTrace(new PrintWriter(stringWriter));
                    taskInfo.setTaskException(stringWriter.toString());
                }
                taskInfo.setUpdateTime(new Date());

            }

        //
        taskInfoService.saveOrUpdateBatch(taskInfoList);
    }

    //2.1 生成位图数据
    //2.1.1  尝试建立正式分区（如果已有就不建立了）
    //2.1.2   针对列表中的每个任务生成位图表的临时分区
    //2.1.3   写入临时分区
    //2.1.4   把临时分区替换为正式分区
    private void execTagBitmap(TaskInfo taskInfo,String dt){

        //2.1.1 尝试建立正式分区（如果已有就不建立了）
        String tagType=taskInfo.getTagValueType().equals('1')?"string":"decimal";
        String partition="p"+ dt.replace("-","")+'_'+taskInfo.getTagId();
        userTagBitmapMapper.addTempPartition(tagType,partition,dt,taskInfo.getTagId());
        //2.1.2   针对列表中的每个任务生成位图表的临时分区
        String tempPartition="tp"+ dt.replace("-","")+'_'+taskInfo.getTagId();
        userTagBitmapMapper.addTempPartition(tagType,tempPartition,dt,taskInfo.getTagId());
        //2.1.3   写入临时分区
        userTagBitmapMapper.insertUserTag(tagType,tempPartition,dt,taskInfo.getTagId(),taskInfo.getTaskSql());
        //2.1.4   把临时分区替换为正式分区
        userTagBitmapMapper.replacePartition(tagType,partition,tempPartition);
    }


    private  void execTagDetail(TaskInfo taskInfo,String dt){
        //2.1.1 尝试建立正式分区（如果已有就不建立了）
        String tagType=taskInfo.getTagValueType().equals('1')?"string":"decimal";
        String partition="p"+ dt.replace("-","")+'_'+taskInfo.getTagId();
        userTagDetailMapper.addTempPartition(tagType,partition,dt,taskInfo.getTagId());
        //2.1.2   针对列表中的每个任务生成位图表的临时分区
        String tempPartition="tp"+ dt.replace("-","")+'_'+taskInfo.getTagId();
        userTagDetailMapper.addTempPartition(tagType,tempPartition,dt,taskInfo.getTagId());
        //2.1.3   写入临时分区
        userTagDetailMapper.insertUserTag(tagType,tempPartition,dt,taskInfo.getTagId(),taskInfo.getTaskSql());
        //2.1.4   把临时分区替换为正式分区
        userTagDetailMapper.replacePartition(tagType,partition,tempPartition);
    }
}
